/**
 * 多选组件
 */
(function(window, angular, undefined){

	var component = angular.module('water.common.component.comSelect',[]);
	
	/**
	 * 基础下拉组件
	 */
	component.directive("comSelect", function($rootScope) {
		return { 
			transclude: false,    // 不复制原始HTML内容 
		    restrict: "E",        // 指令是一个元素 (并非属性) 
		    require : "ngModel",
		    replace: true,        // 使用模板替换原始标记 
		    scope: {              // 设置指令对于的scope 
		      id: "@",          // id 值传递 （字符串，单向绑定）
		      pollType:"@",
		      width:"@width",
		      model:"=ngModel",
		      componentObject:"=componentObject",
		      data: "=",
		      change:"&ngChange"
		    },
		    template:'',
		    link: function ($scope, element, attrs, controller) {
		    	$scope.selectItem = null;
		    	
		    	try{
		    		/**
			    	 * 暴露接口
			    	 */
			    	$scope.componentObject = {
			    			name:attrs.ngModel,
			    			/**
			    			 * 设置数据,并渲染组件，因为跟easyui结合，
			    			 * 所以在业务逻辑中，如果data发生变化，组件的数据不会自动更新，
			    			 * 需要手动setData
			    			 */
			    			setData:function(data){
			    				$scope.data = data;
			    				$scope.renderData($scope.data);
			    			}
			    	}
		    	} catch (e) {
					console.log(e)
				}
		    	
		    	/**
		    	 * 使用easyui渲染组件
		    	 */
		    	$scope.renderData = function(data){
		    		/**
		    		 * 渲染组件
		    		 */
		    		element.combobox({
			    	    data:data,
			    	    valueField:'k',
			    	    textField:'v',
			    	    editable:false,
			    	    onSelect:function(record){
			    	    	/**
			    	    	 * 下拉选择事件，设置当前选择的项
			    	    	 */
			    	    	safeApply($scope,(function(){
			    	    		$scope.selectItem = record;
				    	    	/**
				    	    	 * 在对外的接口上设置选中的项目，提供给父子组件使用
				    	    	 */
				    	    	$scope.componentObject.selectItem = $scope.selectItem;
				    	    	if(record){
				    	    		$scope.model = record.k;
				    	    	}
	                         }));
			    	    }
			    	});
		    		/**
		    		 * 如有有值，设置之
		    		 */
		    		if($scope.model){
		    			var bingo = false;
		    			for(var i=0;i<data.length;i++){
		    				var k = data[i].k
		    				if(k == $scope.model){
		    					element.combobox("select",$scope.model);
		    					bingo = true;
		    					break;
		    				}
		    			}
		    			
		    			if(!bingo){
		    				$scope.model = null;
		    			}
		    		}
		    	}
		    	
		    	function safeApply(scope, fn) {  
		    	    (scope.$$phase || scope.$root.$$phase) ? fn() : scope.$apply(fn);  
		    	}  
		    	
		    	controller.$render = function(){
		    		var viewValue = controller.$viewValue;
		    		$scope.model = viewValue;
		    		element.combobox("select",viewValue);
		    		if($scope.change()){
	    				$scope.change()($scope.selectItem);
		    		}
		    	}
		    	
		    	/**
		    	 * 初始化组件
		    	 */
		    	function _init(){
		    		$scope.renderData($scope.data);
		    	}
		    	_init();
		    }
		  } 
	});
}(window, angular));